package com.sy.interceptor;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 在控制器方法执行之前做的操作
     * @param req
     * @param res
     * @param o
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object o) throws Exception {
        System.out.println("控制器方法执行之前做的操作...");
        if (o instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) o;
            System.out.println("要执行的控制器类：" + handlerMethod.getBeanType().getName());
            System.out.println("要执行的控制器方法：" + handlerMethod.getMethod().getName());
            System.out.println("要执行的控制器方法传入的参数：" + handlerMethod.getMethodParameters());
        }
        //这里的返回值如果为false，就表示执行后面的拦截器和控制器不执行
        //如果要放行，则这个方法要返回true
        return true;
    }

    /**
     * 控制器方法执行完毕，视图返回之前
     * @param req
     * @param res
     * @param o
     * @param mv 控制器方法执行完毕后，此时ModelAndView对象
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView mv) throws Exception {
        System.out.println("控制器方法执行完毕，视图返回之前...");
        //在这里可以通过mv对象来控制最终要返回的视图
        //mv.setViewName("error");
    }

    /**
     * 控制器方法执行完毕，且视图已经返回
     * @param req
     * @param res
     * @param o
     * @param e 获取控制器方法抛出的异常信息（注意和异常处理器中的冲突，防止处理器中处理掉异常，此处获取不到）
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object o, Exception e) throws Exception {
        System.out.println("控制器方法执行完毕，且视图已经返回...");
        System.out.println("错误信息："+e.getMessage());
    }
}
